﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Dao;
using _InformaticaIndustrial_DerivdosVinicos.DTO;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
	public partial class ABMRuta : Form
	{
		#region Property

		private int idR;
		private RutaFabricacion rutaFabricacion;
		private DTORutaCentro dtoRutaCentro;
		private IPRutaFabricacion ipRuta = new IPRutaFabricacion();
		private IPProducto ipProducto = new IPProducto();
		private IPCentroTrabajo ipCentro = new IPCentroTrabajo();
		private const string integerPattern = "[0-9]+";
		private IList<RF_CT> rutasABorrar = new List<RF_CT>();

		#endregion Property

		#region Events

		public ABMRuta(int id)
		{
			InitializeComponent();
			dgvRutasCentros.AutoGenerateColumns = false;
			LoadCombos();
			idR = id;

			if (idR != 0)
				LoadControls();
		}

		private void btAgregar_Click(object sender, EventArgs e)
		{
			try
			{
				ValidarCampos();

				if (rutaFabricacion == null)
					rutaFabricacion = new RutaFabricacion();

				RF_CT rutaCentro;

				if (dtoRutaCentro == null)
				{
					rutaCentro = new RF_CT
					{
						CentroTrabajo = (CentroTrabajo)cbCentro.SelectedItem,
						RutaFabricacion = rutaFabricacion,
						orden = int.Parse(txtOrden.Text.Trim()),
						hsTrabajo = int.Parse(txtHsMOEjec.Text.Trim()),
						hsPreparacion = int.Parse(txtHsMOPrep.Text.Trim()),
						hsMaquina = int.Parse(txtHsMaquina.Text.Trim())
					};

					rutaFabricacion.RF_CTs.Add(rutaCentro);
				}
				else
				{
					rutaCentro = rutaFabricacion.RF_CTs.Single(rc => rc.orden == dtoRutaCentro.orden);

					rutaCentro.CentroTrabajo = (CentroTrabajo)cbCentro.SelectedItem;
					rutaCentro.orden = int.Parse(txtOrden.Text.Trim());
					rutaCentro.hsTrabajo = int.Parse(txtHsMOEjec.Text.Trim());
					rutaCentro.hsPreparacion = int.Parse(txtHsMOPrep.Text.Trim());
					rutaCentro.hsMaquina = int.Parse(txtHsMaquina.Text.Trim());
				}

				LoadDGV();
				ResetControls();
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
			}
		}

		private void btGuardar_Click(object sender, EventArgs e)
		{
			try
			{
				if (dgvRutasCentros.Rows.Count > 0)
				{
					rutaFabricacion.Producto = (Producto)cbProducto.SelectedItem;

					if (idR == 0)
						ipRuta.save<RutaFabricacion>(rutaFabricacion);

					ipRuta.DeleteRF_CT(rutasABorrar);

					IPRutaFabricacion.confirmarCambios();

					MessageBox.Show("Ruta de fabricación guardada correctamente");
					this.Close();
				}
				else
					MessageBox.Show("Debe agregar al menos un centro");
			}
			catch (Exception)
			{
				MessageBox.Show("Ocurrió un error al guardar la ruta de fabricación");
			}
		}

		private void btSalir_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		private void dgvRutasCentros_CellContentClick(object sender, DataGridViewCellEventArgs e)
		{
			try
			{
				switch (e.ColumnIndex)
				{
					case 6:
						dtoRutaCentro =  (DTORutaCentro)dgvRutasCentros.Rows[e.RowIndex].DataBoundItem;
						LoadControlsFromDTO();
						break;
					case 7:
						int orden = ((DTORutaCentro)dgvRutasCentros.Rows[e.RowIndex].DataBoundItem).orden;
						RF_CT rf_ct = rutaFabricacion.RF_CTs.Single(rf => rf.orden == orden);
						rutaFabricacion.RF_CTs.Remove(rf_ct);

						if (rf_ct.IdCT_RF != 0)
							rutasABorrar.Add(rf_ct);

						LoadDGV();
						break;
					default:
						break;
				}
			}
			catch (Exception)
			{
				string accion = (e.ColumnIndex == 0 ? "modificar" : "eliminar");

				MessageBox.Show("Ocurrió un error al " + accion + " el producto");
			}
		}

		#endregion Events

		#region Methods

		private void LoadCombos()
		{
			cbProducto.DataSource = ipProducto.getAll<Producto>();
			cbCentro.DataSource = ipCentro.getAll<CentroTrabajo>();
		}

		private void LoadControls()
		{
			if ((rutaFabricacion = (RutaFabricacion)ipRuta.getPorId(idR)) != null)
			{
				cbProducto.SelectedValue = rutaFabricacion.IdProducto;
				LoadDGV();
			}
			else
				MessageBox.Show("La ruta con el Id = " + ipRuta + " no se encontró");
		}

		private void LoadControlsFromDTO()
		{
			txtOrden.Text = dtoRutaCentro.orden.ToString();
			cbCentro.SelectedValue = dtoRutaCentro.idCentro;
			txtHsMOEjec.Text = dtoRutaCentro.hsTrabajo.ToString();
			txtHsMOPrep.Text = dtoRutaCentro.hsPreparacion.ToString();
			txtHsMaquina.Text = dtoRutaCentro.hsMaquina.ToString();
		}

		private void LoadDGV()
		{
			dgvRutasCentros.DataSource = GetDTOsRutas();
		}

		private IList<DTORutaCentro> GetDTOsRutas()
		{
			IList<DTORutaCentro> dtos = new List<DTORutaCentro>();
			DTORutaCentro dto;

			IList<RF_CT> rutasCentros = rutaFabricacion.RF_CTs.OrderBy(rc => rc.orden).ToList();

			foreach (var item in rutasCentros)
			{
				dto = new DTORutaCentro
				{
					id = item.IdCT_RF,
					orden = item.orden.Value,
					hsTrabajo = item.hsTrabajo.Value,
					hsPreparacion = item.hsPreparacion.Value,
					hsMaquina = item.hsMaquina.Value,
					NombreCentro = item.CentroTrabajo.nombreCtroTrab,
					idCentro = item.IdCT,
					idRuta = item.IdRF
				};

				dtos.Add(dto);
			}

			return dtos;
		}

		private void ValidarCampos()
		{
			if (!Regex.IsMatch(txtOrden.Text.Trim(), integerPattern))
				throw new Exception("El orden debe ser un número entero");

			if (!Regex.IsMatch(txtHsMOEjec.Text.Trim(), integerPattern))
				throw new Exception("Las hs. de Mano de Obra de Ejecución deben ser un número entero");

			if (!Regex.IsMatch(txtHsMOPrep.Text.Trim(), integerPattern))
				throw new Exception("Las hs. de Mano de Obra de Preparación deben ser un número entero");

			if (!Regex.IsMatch(txtHsMaquina.Text.Trim(), integerPattern))
				throw new Exception("Las hs. de Máquina deben ser un número entero");

            //if (dgvRutasCentros.Rows.Count > 0)
            //{
            //    foreach (DataGridViewRow item in dgvRutasCentros.Rows)
            //    {
            //        if (item.Cells["Orden"].Value.ToString().Equals(txtOrden.Text.Trim()))
            //            throw new Exception("El orden ingresado ya se ha cargado");
            //    }
            //}
		}

		private void ResetControls()
		{
			txtOrden.Text = "";
			txtHsMOEjec.Text = "";
			txtHsMOPrep.Text = "";
			txtHsMaquina.Text = "";
			cbCentro.SelectedIndex = 0;

			dtoRutaCentro = null;
		}

		#endregion Methods
	}
}